perm filename DEBAL.SAI[AL,HE]2 blob
sn#371212 filedate 1978-08-03 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00008 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 AL RUN TIME SYSTEM DEBUGGER'S USER INTERFACE
C00004 00003 ! Initializing OPCODES i.e. the symbolic opcode table
C00006 00004 PROCEDURE HELP
C00010 00005 ! EQSTR, FIND
C00013 00006 STRING PROCEDURE VARID(STRING S, OPCODE)
C00018 00007 PRINT(CRLF,"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
C00020 00008 WHILE TRUE DO
C00024 ENDMK
C⊗;
COMMENT AL RUN TIME SYSTEM DEBUGGER'S USER INTERFACE;
BEGIN "DEBAL"
REQUIRE "ABBREV.SAI[AL,HE]" SOURCE_FILE;
REQUIRE "ALAID.REL[AL,HE]" LOAD_MODULE;
EXTERNAL RECURSIVE STRING PROCEDURE TREATREQUEST
(STRING STR; INTEGER SOURCE);
EXTERNAL PROCEDURE ALAIDINIT;
REQUIRE "⊂⊃⊂⊃" DELIMITERS;
DEFINE NUMBER_OF_PCODES = 111 ;
DEFINE LIST_LENGTHS = 100 ;
DEFINE EXIT="GOTO END_OF_PROGRAM";
DEFINE ERROREXIT=⊂BEGIN
PRINT(CRLF,"ERROR REPORT FROM DEBAL");
EXIT
END;⊃;
LABEL END_OF_PROGRAM;
INTEGER I, BRCHAR, INDEX;
INTEGER ARRAY LO_LIST[1:LIST_LENGTHS];
STRING ARRAY ID_LIST[1:LIST_LENGTHS];
STRING STR;
BOOLEAN PERIOD, ALSINIT, NUMERIC;
EXTERNAL STRING FILALS;
! Initializing OPCODES i.e. the symbolic opcode table
This expression is parallel to the file INTARG.PAL[AL,HE] and should follow changes
in that file ;
PRELOAD_WITH
"MOVE",
"CENTER",
"STOP",
"TFRCST",
"VMKFRC",
"COMPLY",
"COMPOFF",
"NOTICE",
"NOOP",
"MVAR",
"KVAR",
"GTVAL",
"CHNGE",
"PUSHV",
"POPV",
"COPY",
"REPLAC",
"JUMP",
"JUMPC",
"TERMINATE",
"PROC",
"RETURN",
"SPROUT",
"FORCHK",
"CASE",
"SIGNAL",
"WAITE",
"PAUSE",
"ABORT",
"GODDT",
"NOOP",
"NOOP",
"INT",
"AFFIX",
"UNFIX",
"SLE",
"SLT",
"SGE",
"SGT",
"SEQ",
"SNE",
"AND",
"LOR",
"NOT",
"LXOR",
"EQV",
"WHERE",
"SADD",
"SSUB",
"SNEG",
"SMUL",
"SDIV",
"NOOP",
"SABS",
"VMAGN",
"VDOT",
"SSBRTN",
"TMAGN",
"TAXIS",
"VMAKE",
"SVMUL",
"VSDIV",
"VADD",
"VSUB",
"UNITV",
"CROSV",
"TVMUL",
"TPOS",
"TORIEN",
"VSAXWR",
"TMAKE",
"TVADD",
"TVSUB",
"TTMUL",
"TINVRT",
"CONSTR",
"MAX",
"MIN",
"IDIV",
"MOD",
"CMENBL",
"CMDSBL",
"CMTRIG",
"CMSKED",
"CMUNCR",
"CMDONE",
"CMFORCE",
"CMSENSE",
"CMDUR",
"NOOP",
"NOOP",
"PROG",
"ENDP",
"PROMPT",
"SCALRD",
"PRINT",
"VALPRN",
"VARPRN",
"QUERY",
"NOOP",
"NOOP",
"BRACE",
"NOOP",
"TOPAL" ;
STRING ARRAY OPCODES[1:NUMBER_OF_PCODES] ; ! PCODE SYMBOL TABLE;
PROCEDURE HELP;
BEGIN "help"
PRINT( CRLF,"Currently acceptable commands are:"
,CRLF
,CRLF,"BREAK n ........ to set a breakpoint at n (octal≥100000)"
,CRLF,"DDT ........ to enter DDT on the pdp-11"
,CRLF,"EXIT ........ to exit from debal (end debugging)"
,CRLF,"GETVAL (NAME a) -or- GETVAL (OFFSET n) .... to get the value ofa variable"
,CRLF," identified either by its alphabetic"
,CRLF," name or octal offset."
,CRLF,"GO ........ to proceed execution after a halt "
,CRLF,"HALT ........ to halt all active (existing) interpreters"
,CRLF,"HELP ........ to type this text"
,CRLF,"? ........ like HELP"
,CRLF,"JUMP n ........ to resume execution (after a halt) from pcode address n"
,CRLF,"NOTICE ........ to update the current device values (if have changed mannually"
,CRLF,"NUMERIC ........ to see the pcodes in numeric (octal) form"
,CRLF,"N ........ like NUMERIC"
,CRLF,"PUT n AT m ..... to put pcode n at address m (both octal)"
,CRLF,"SETVAL (α) (β) .. to change the value of α to β , where:"
,CRLF," α ::= NAME a | OFFSET n"
,CRLF," β ::= SCALAR d | VECTOR d d d | TRANS ....."
,CRLF,"SYMBOLIC ........ to see the pcodes in symbolic (alphabetic) form"
,CRLF,"S ........ like SYMBOLIC"
,CRLF,"SHOW n ........ to show n pcodes (1≤n≤7) starting from current IPC"
,CRLF,"SIGNAL (α) ...... to signal an AL event α (as defined above)"
,CRLF,"START n -or- START ... to start a new copy of interpreter n (main if no argument)"
,CRLF,"STEP n .......to execute n interpret instructions (e.g. STEP 1 for single stepping)"
,CRLF,"TIMEOUT d ...... to set the timeout limit to 'd' (a decimal number)"
,CRLF,"TIMEOUT ........ (without an argument) to see the current value"
,CRLF," of the timeout limit"
,CRLF,"UNBREAK n ...... to clear (delete) breakpoint at n"
,CRLF,"WAIT (α) ........ to wait an AL event α (as defined above)"
,CRLF,"X ........ like EXIT"
,CRLF);
END
;
! EQSTR, FIND;
BOOLEAN PROCEDURE EQSTR(STRING A,B);
BEGIN
STRING PROCEDURE CAPTAL(STRING S);
BEGIN
INTEGER I, L;
STRING SC, C;
L← LENGTH(S);
SC ← "";
FOR I←1 STEP 1 UNTIL L DO
BEGIN
C← S[I FOR 1];
IF (C ≥ '141) AND (C ≤ '172)
THEN SC ← SC & (C - '40)
ELSE SC ← SC & C
;
END
;
RETURN(SC);
END
;
RETURN(EQU(CAPTAL(A),CAPTAL(B)));
END
;
BOOLEAN PROCEDURE FIND(STRING SUBSET, SUPERSET; REFERENCE INTEGER INDEX);
BEGIN
INTEGER L,LS,I;
STRING FIRST;
FIRST←SUBSET[1 FOR 1];
LS ← LENGTH(SUBSET);
L ← LENGTH(SUPERSET) - LS + 1 ;
FOR I←INDEX STEP 1 UNTIL L DO
BEGIN
IF SUPERSET[I FOR 1]=FIRST
THEN BEGIN
IF EQU(SUPERSET[I FOR LS],SUBSET)
THEN BEGIN
INDEX ← I + LS;
RETURN(TRUE);
END
;
END
;
END
;
RETURN(FALSE)
END
;
STRING PROCEDURE VARID(STRING S, OPCODE);
BEGIN
! String S has a level_offset octal substring in front of it,
we are going to find its symbolic variable ID taken from the
program's *.ALS file and replace the octal form with it;
INTEGER FILCHAN, COUNT, BRCHAR, EOF, LEVOFSET, FLAG;
INTEGER WTABL1, WTABL2, WTABL3, WTABL4;
INTEGER VAL, I;
STRING SYM, SREM;
SREM← S;
IF OPCODE ≠ "CHNGE" AND
OPCODE ≠ "GTVAL" AND
OPCODE ≠ "WAITE" AND
OPCODE ≠ "SIGNAL" AND
OPCODE ≠ "CMDSBL" AND
OPCODE ≠ "CMENBL"
OR FILALS = ""
THEN RETURN(S)
;
IF ¬ ALSINIT
THEN BEGIN
! Open the file for input of symbols;
FILCHAN ← GETCHAN;
COUNT ← 200;
OPEN(FILCHAN,"DSK",0,2,0,COUNT,BRCHAR,EOF);
LOOKUP(FILCHAN,FILALS,FLAG);
IF FLAG
THEN RETURN(S)
;
! Initialize the break tables;
WTABL1← GETBREAK;
WTABL2← GETBREAK;
WTABL3← GETBREAK;
WTABL4← GETBREAK;
SETBREAK(WTABL1," ()+-"&'12&'11,'15,"IRK"); ! Stop at delimiter, retain;
SETBREAK(WTABL3,'11&'12&'15,'11&'12&'15,"XR"); ! Skip <cr>, <lf> and <tab>;
SETBREAK(WTABL4,".",NULL,"IS"); ! Skip to and through period;
! The format for this file is:
name<tab>level-offset<crlf>
repeated until the end of file. Example:
$B1.F3 36
;
! Read in the symbols;
INPUT(FILCHAN,WTABL3); ! Skip <tab>;
SYM ← INPUT(FILCHAN,WTABL1); ! Stop at tab;
INPUT(FILCHAN,WTABL3); ! Skip <tab>;
WHILE ¬EOF DO
BEGIN "readsym"
LEVOFSET ← CVO(INPUT(FILCHAN,WTABL1));
INPUT(FILCHAN,WTABL3); ! Skip <crlf>;
IF LENGTH(SYM)>3
THEN BEGIN
! Add this item to the symbol/name table;
SCAN(SYM,WTABL4,BRCHAR); ! Strip off the block name;
IF INDEX=LIST_LENGTHS
THEN BEGIN
PRINT(CRLF,"*** Too many variables !"
,CRLF,"Only ", LIST_LENGTHS ,
" of them will enter the symbol table.");
DONE "readsym";
END
;
INDEX←INDEX+1;
ID_LIST[INDEX]← SYM;
LO_LIST[INDEX]← LEVOFSET;
END
;
SYM ← INPUT(FILCHAN,WTABL1); ! Stop at tab;
INPUT(FILCHAN,WTABL3); ! Skip <tab>;
END "readsym"
;
RELEASE(FILCHAN);
ALSINIT← TRUE;
END
;
! Taking the value of the octal form;
VAL← CVO(CVS(INTSCAN(S,BRCHAR)));
IF VAL=0 OR BRCHAR < 0
THEN RETURN(S)
;
! Searching the symbol/id table/list ;
FOR I←1 STEP 1 UNTIL INDEX DO
BEGIN
IF LO_LIST[I] = VAL
THEN RETURN( " " & ID_LIST[I] & CR & S )
;
END
;
! If search was unsuccessful then we return original S ! ;
RETURN( SREM ) ;
END
;
PRINT(CRLF,"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
,CRLF
,CRLF," WELCOME TO AL RUN-TIME-SYSTEM DEBUGGER !!"
,CRLF
,CRLF,"Type ? to see a list of"
,CRLF,"commands (any time !)."
,CRLF
,CRLF,"Please enter the symbol table (*.als) file name");
OUTSTR(CRLF & ":*: ");
PTOSTR(0,"SYMBOL ");
PERIOD ← FALSE;
STR ← INCHWL;
IF STR[8 FOR 1]="?" OR EQSTR(STR[8 FOR 4],"HELP") THEN HELP
ELSE IF EQSTR(STR[8 FOR 4],"EXIT") THEN EXIT
ELSE IF LENGTH(STR) > 7
THEN BEGIN
FOR I←1 STEP 1 UNTIL LENGTH(STR) DO
IF STR[I TO I] = "." THEN PERIOD ← TRUE
;
IF NOT PERIOD THEN STR ← STR&".ALS" ;
OUTSTR(TREATREQUEST(STR,1));
END ;
ID_LIST[1]← "BARM";
ID_LIST[2]← "BHAND";
LO_LIST[1]← '14;
LO_LIST[2]← '16;
INDEX ← 2 ;
ALSINIT ← FALSE ;
NUMERIC ← FALSE ;
WHILE TRUE DO
BEGIN "aid" ! Look at a user request;
OUTSTR(CRLF & ":*: ");
STR ← INCHWL; ! TTYINL(WTABL0,BRCHAR);
IF STR="?" OR EQSTR(STR[1 TO 4] ,"HELP") THEN HELP
ELSE BEGIN
IF EQSTR(STR[1 TO 4],"EXIT") OR EQSTR(STR[1 FOR 1],"X") THEN EXIT;
IF EQSTR(STR,"N") OR EQSTR(STR,"NUMERIC")
THEN BEGIN
NUMERIC← TRUE;
PRINT("OK. NUMERIC (octal) ...");
CONTINUE;
END
;
IF EQSTR(STR,"S") OR EQSTR(STR,"SYMBOLIC")
THEN BEGIN
NUMERIC← FALSE;
PRINT("OK. SYMBOLIC ...");
CONTINUE;
END
;
IF STR≠"" THEN BEGIN
INTEGER N;
STRING TEMPSTR;
TEMPSTR ← (TREATREQUEST(STR,1));
IF NUMERIC
THEN BEGIN
PRINT(TEMPSTR);
CONTINUE;
END
;
N ← 1;
WHILE FIND("ADDRESS:",TEMPSTR,N) DO
! Get rid of "ADDRESS:" and put ">>" after the
six octal digits address value;
TEMPSTR← TEMPSTR[1 TO N-9] & TEMPSTR[N+1 FOR 6]
& " >>" & TEMPSTR[N+8 TO ∞]
;
N ← 1;
WHILE FIND("P_CODE:",TEMPSTR,N) DO
BEGIN
STRING OPCODE,LHALF,RHALF;
INTEGER OCTVAL,DECVAL,BRCHAR;
RHALF ← TEMPSTR[N TO ∞];
OCTVAL ← INTSCAN(RHALF,BRCHAR);
IF (OCTVAL=0) ∧ (BRCHAR ≤ 0) THEN ERROREXIT;
DECVAL ← CVO(CVS(OCTVAL));
IF DECVAL ≤ 0 OR (DECVAL/2) > NUMBER_OF_PCODES
THEN BEGIN
RHALF← RHALF
& CRLF & "!? --- INVALID OPCODE DETECTED";
OPCODE← "!? " & TAB & " " & CVS(OCTVAL);
END
ELSE OPCODE← OPCODES[DECVAL/2]
;
LHALF ← IF TEMPSTR[N FOR 1]="*"
THEN TEMPSTR[1 TO N-9] & "*" & TAB
ELSE TEMPSTR[1 TO N-8]
;
TEMPSTR ← IF RHALF[1 FOR 1]=","
THEN LHALF & OPCODE & TAB &
VARID(RHALF[2 TO ∞] , OPCODE)
ELSE LHALF & OPCODE & CR & RHALF
;
END
;
PRINT(TEMPSTR);
END;
END;
END "aid";
END_OF_PROGRAM:
END "DEBAL"